# 导入包
import pygame, random

# 窗口大小
SCREEN = pygame.Rect(0, 0, 400, 825)
# 帧率
FRAME_PER_SEC = 60
# 敌机定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
CREATE_ENEMY_EVENT2 = pygame.USEREVENT + 3
# 英雄子弹定时器常量
HERO_FIRE_EVENT = pygame.USEREVENT + 1

# 图片路径
bg_img = 'images/background.png'
ey_img = 'images/enemy.png'
ey2_img = 'images/enemy2.png'
hr_img = 'images/hero.png'
bu_img = 'images/dd.png'
logo_img = 'images/logo.png'

# 音频路径
bgm = 'music/BGM.wav'
bom = 'music/BOM.wav'
over_music = 'music/OVER.wav'

# 模块.类pygame.sprite.Sprite
class GameSprite(pygame.sprite.Sprite): 
    # 初始化方法
    def __init__(self, image_name, speed = 10):
        # 用父类的初始化方法
        super().__init__()
        
        # 定义对象属性
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed
    # 定义对象方法
    def update(self):
        # 通过加y来让敌机移动
        self.rect.y += self.speed

class background(GameSprite):
    def __init__(self, is_alt = False):
        # 1.用父类的初始化方法
        super().__init__(bg_img)
        # 2.判断是否是第2张图片，如果是，设置初始位置
        if is_alt:
            self.rect.y = -self.rect.height

    def update(self):
        # 1.用父类的初始化方法
        super().update()

        # 2.判断是否移出屏幕，如果移出了，
        # 就把图像设置在屏幕上方
        if self.rect.y >= SCREEN.height:
            self.rect.y = -self.rect.height

class Enemy(GameSprite):
    def __init__(self, ey_img):
        # 父类初始化
        super().__init__(ey_img)
        # 随机速度
        self.speed = random.randint(1, 15)
        # 敌机初始位置
        # y方向初始位置
        self.rect.bottom = 0
        # x方向初始位置
        max_x = SCREEN.width - self.rect.width
        self.rect.x = random.randint(0, max_x)

    def update(self):
        # 垂直飞行
        super().update()
        # 判断
        if self.rect.y > SCREEN.height:
            self.kill()

class Hero(GameSprite):
    def __init__(self):
        # 父类初始化
        super().__init__(hr_img, 0)
        # 定义初始位置
        # x屏幕中间
        self.rect.centerx = SCREEN.centerx
        # y距底部120
        self.rect.bottom = SCREEN.bottom - 120

        # 创建导弹精灵组
        self.bullets = pygame.sprite.Group()

    def update(self):
        # 移动
        self.rect.x += self.speed
        # 控制界限
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.right > SCREEN.right:
            self.rect.right = SCREEN.right

    def fire(self):
        # 发射三次，用循环
        for i in range(0, 1, 2):
            # 创建导弹精灵
            bullet = Bullet()
            # 设置初始位置
            bullet.rect.bottom = self.rect.y - i * 20
            bullet.rect.centerx = self.rect.centerx
            # 添加至精灵组
            self.bullets.add(bullet)

class Bullet(GameSprite):
    def __init__(self):
        super().__init__(bu_img, -2)

    def update(self):
        super().update()
        if self.rect.bottom < 0:
            self.kill()

class gamesound(object):
    def __init__(self):
        # 初始化
        pygame.mixer.init()
        # 加载
        pygame.mixer.music.load(bgm)
        # 设置音量
        pygame.mixer.music.set_volume(0.5)

        self.__bom = pygame.mixer.Sound(bom)
        self.__over_music = pygame.mixer.Sound(over_music)

    def playmusic(self):
        pygame.mixer.music.play(-1)

    def playbommusic(self):
        pygame.mixer.Sound.play(self.__bom)

    def playovermusic(self):
        pygame.mixer.Sound.play(self.__over_music)
